package manong.serviceimpl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import manong.beans.*;
import manong.constant.ServerResponse;
import manong.mapper.ClassesMapper;
import manong.mapper.ClassroomMapper;
import manong.mapper.CourseTableMapper;
import manong.mapper.StuMapper;
import manong.service.ICourseTableService;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Queue;

@Service
public class CourseTableServiceImpl implements ICourseTableService {

    @Autowired
    private CourseTableMapper courseTableMapper;
//将一个名为courseTableMapper的CourseTableMapper实例注入到当前类中。这个CourseTableMapper通常用于访问数据库，
    //可能是一个MyBatis的映射器接口，它包含了对CourseTable实体进行数据库操作的方法。

    @Autowired
    private StuMapper stuMapper;
    @Autowired
    private ClassesMapper classesMapper;

    @Override
    public ServerResponse<String> arr() {

        return null;
    }
    //需要实现以返回实际响应

    @Override
    public ServerResponse<List<CourseTable>> findBy(String className, String teacherName,Integer week) {
    	//根据某些过滤条件检索CourseTable记录列表。
        CourseTableQuery query =new CourseTableQuery();
        CourseTableQuery.Criteria criteria = query.createCriteria();
        //创建了一个 CourseTableQuery 对象和一个 CourseTableQuery.Criteria 对象来构建查询条件。
        if (className!=null&&!"".equals(className)){
            criteria.andClassNameLike("%"+className+"%");
        }//检查是否提供了 className 和 teacherName 并且不为空，并向查询添加相应的条件。
        if (teacherName!=null&&!"".equals(teacherName)){
            criteria.andTecherNameEqualTo(teacherName);
        }
        criteria.andStatuEqualTo(week);//使用 criteria.andStatuEqualTo(week) 添加了一个针对 week 的条件
        List<CourseTable> courseTables = courseTableMapper.selectByExample(query);
        //使用 courseTableMapper.selectByExample(query) 执行查询，并将结果以 ServerResponse 对象返回。
        return ServerResponse.createBySuccess(courseTables);
    }
//基于各种过滤条件和分页来执行数据库查询。
    @Override
    public ServerResponse<PageInfo<CourseTable>> findAllBy(Integer pageNum, Integer pageSize, Integer week, String courseName, String className, String teacherName, String roomName) {
        //用于执行更全面的数据库查询，并具有附加的分页功能。
    	CourseTableQuery query = new CourseTableQuery();
        query.createCriteria().andStatuEqualTo(week)  //创建了一个 CourseTableQuery 对象，并使用 query.createCriteria() 方法设置了各种过滤条件。
                .andCourseNameLike("%"+courseName+"%")
                .andClassNameLike("%"+className+"%")
                .andTecherNameLike("%"+teacherName+"%")
                .andRoomNameLike("%"+roomName+"%");
        PageHelper.startPage(pageNum, pageSize);//使用 PageHelper 实用程序来指定分页的页码和页面大小。
        List<CourseTable> list = courseTableMapper.selectByExampleWithRowbounds(query,new RowBounds((pageNum-1)*10,pageSize));
        //执行了带分页的查询。
        PageInfo<CourseTable> pageInfo = new PageInfo<>(list);
        pageInfo.setTotal(courseTableMapper.countByExample(query));//创建了一个 PageInfo 对象来封装查询结果，包括记录的总数。
        return ServerResponse.createBySuccess(pageInfo);//将结果以 ServerResponse 对象的形式返回。

    }


    /*
     通过不同级别的过滤和分页来查询数据库中的 CourseTable 表。findBy 方法根据特定的周和可选的班级和教师名称过滤器检索课程列表，
     而 findAllBy 方法提供了更广泛的过滤和分页选项。结果以 ServerResponse 对象返回，其中可能包含有关查询成功或失败以及检索到的数据的信息。
     */

    @Override
    public ServerResponse<String> adjust(Integer courseTableId, Integer classroomId, Integer week, String day, Integer number, String classroomName) {
        //提供的参数调整课程表的特定条目
    	CourseTable courseTable = courseTableMapper.selectByPrimaryKey(courseTableId);
    	//courseTableMapper.selectByPrimaryKey(courseTableId)从数据库中检索一个CourseTable对象，该对象对应于给定的courseTableId。
        courseTable.setStatu(week);
        courseTable.setRoomId(classroomId);
        courseTable.setRoomName(classroomName);
        courseTable.setTimeName(day);
        courseTable.setTimeId(number);
        //根据提供的参数更新CourseTable对象的各个字段，如statu、roomId、roomName、timeName 和 timeId。
        int count = courseTableMapper.updateByPrimaryKey(courseTable);
        //用courseTableMapper.updateByPrimaryKey(courseTable)将更新后的CourseTable对象保存回数据库。
        if (count >0){
            return ServerResponse.createBySuccessMessage("调整成功");
        }
        return ServerResponse.createByErrorMessage("调整失败");
    }//如果更新操作成功（count > 0），则返回一个包含成功消息的 ServerResponse，否则返回一个包含失败消息的 ServerResponse。




    //根据提供的参数（courseTableId、classroomId、week、day、number、classroom Name）来调整课程表条目。
   // 它根据courseTableId从数据库中检索一个CourseTable对象，使用提供的参数更新CourseTable对象。
   //然后，它更新数据库中的CourseTable，并返回成功或失败消息。


    @Override
    public ServerResponse<String> add(CourseTable courseTable) {

        return null;
    }

    @Override
    public ServerResponse<String> del(Integer id) {
        int count = courseTableMapper.deleteByPrimaryKey(id);
        //用于删除课程表中的特定条目，根据提供的id。
      //  它首先使用courseTableMapper.deleteByPrimaryKey(id)从数据库中删除指定id的课程表记录。
        if (count > 0) {
            return ServerResponse.createBySuccessMessage("删除成功");
        }
        return ServerResponse.createByErrorMessage("删除失败");
    }
//如果删除操作成功（count > 0），则返回一个包含成功消息的 ServerResponse，否则返回一个包含失败消息的 ServerResponse。



    @Override
    public ServerResponse<String> update(CourseTable courseTable) {

        return null;
    }

    @Override
    public ServerResponse<CourseTable> find(Integer id) {
        return ServerResponse.createBySuccess(courseTableMapper.selectByPrimaryKey(id));
    }//这是一种通过主键获取特定数据库记录的标准方法。

    //此方法根据提供的id从数据库中检索特定的课程表条目。
    //它使用courseTableMapper.selectByPrimaryKey（id）通过其主键（id）获取CourseTable对象。
    //然后，返回一个ServerResponse，其中包含检索到的CourseTable对象。




    @Override
    public ServerResponse<PageInfo<CourseTable>> findAll(Integer pageNum, Integer pageSize) {
        CourseTableQuery query = new CourseTableQuery();//创建了一个 CourseTableQuery 对象，用于定义查询条件。
        PageHelper.startPage(pageNum, pageSize);//启用分页，这意味着每页只返回特定数量的记录，基于 pageNum 和 pageSize 的值。
        List<CourseTable> list = courseTableMapper.selectByExampleWithRowbounds(query,new RowBounds((pageNum-1)*10,pageSize));
        // 从数据库中检索 CourseTable 对象列表。RowBounds 用于指定要获取的行的范围。
        PageInfo<CourseTable> pageInfo = new PageInfo<>(list);
        //创建一个 PageInfo 对象来封装 CourseTable 对象列表
        pageInfo.setTotal(courseTableMapper.countByExample(query));
        //使用 courseTableMapper.countByExample(query) 设置记录的总数。
        return ServerResponse.createBySuccess(pageInfo);
        //返回一个包含 PageInfo 对象的 ServerResponse，其中包含了分页的课程表条目列表。
    }
   // 从数据库中检索课程表条目的分页列表
    //使用MyBatis中的PageHelper实用程序，通过指定pageNum（当前页面）和pageSize（每页条目数）来启用分页。


    @Override
    public String findByClassName(String sno) {
        StuQuery stuQuery = new StuQuery();
        stuQuery.createCriteria().andSnoEqualTo(Integer.parseInt(sno));//添加一个条件，根据学号去查询
        Stu stu = stuMapper.selectOneByExample(stuQuery);//查询到一个学生对象
        ClassesQuery classesQuery = new ClassesQuery();
        classesQuery.createCriteria().andIdEqualTo(stu.getClassid());//拿出学生对象里面classid，即教室id
        Classes classes = classesMapper.selectOneByExample(classesQuery);//根据classid查询班级
        return classes.getClassName();//再将班级的名字进行返回
    }

    @Override
    public ServerResponse<PageInfo<CourseTable>> findAllByTeacher(Integer pageNum, Integer pageSize, String teacherName) {
        //用于执行更全面的数据库查询，并具有附加的分页功能。
        CourseTableQuery query = new CourseTableQuery();
        query.createCriteria().andTecherNameLike("%"+teacherName+"%");
        PageHelper.startPage(pageNum, pageSize);//使用 PageHelper 实用程序来指定分页的页码和页面大小。
        List<CourseTable> list = courseTableMapper.selectByExampleWithRowbounds(query,new RowBounds((pageNum-1)*10,pageSize));
        //执行了带分页的查询。
        PageInfo<CourseTable> pageInfo = new PageInfo<>(list);
        pageInfo.setTotal(courseTableMapper.countByExample(query));//创建了一个 PageInfo 对象来封装查询结果，包括记录的总数。
        return ServerResponse.createBySuccess(pageInfo);//将结果以 ServerResponse 对象的形式返回。

    }
}
